package main

import "fmt"

// 测试下参数传递和 短赋值初始化互相的影响

// 在 Go 中，变量遮蔽（Variable Shadowing） 是指在一个作用域内，一个变量名被重新声明，导致外部的同名变量被“遮蔽”，无法直接访问。

func stringUse() {
	var strno string
	//if nil == strno {// invalid operation: nil == strno (mismatched types untyped nil and string)
	// if !strno { // invalid operation: operator ! not defined on strno (variable of type string)
	// }
	fmt.Println("no init string len is:", len(strno)) //no init string len is: 0
}

func mainRunPassParam() {
	stringUse()
	a, b := callerA()
	fmt.Println(a, b) // a b

	msg, strGet := ProcFrontendPacket(3)
	fmt.Println("out:", msg)                 //out: <nil>
	fmt.Println("out:", len(strGet), strGet) //out: 0

	fmt.Println(foo((8)))
	fmt.Println(foo((11118)))
}

func callerA() (a, b string) {

	//a, b, _ := callerB() //no new variables on left side of :=
	a, b, c := callerB()
	fmt.Println(c) // c
	return
}

func callerB() (a, b, c string) {
	return "a", "b", "c"
}

func ProcFrontendPacket(msgID int) (msg interface{}, strGet string) {
	if msgID > 0 {
		msg, _, strGet := DecodeMessage(msgID)
		fmt.Println("in:", msg, strGet) // in: xxx zzz
	}
	return
}

// func ProcFrontendPacket(msgID int) (msg interface{}, strGet string) {
// 	msg, _, strGet := DecodeMessage(msgID)//error: no new variables on left side of := (exit status 1)
// 	fmt.Println("in:", msg, strGet)
// 	return
// }

func DecodeMessage(msgid int) (interface{}, string, string) {
	return "xxx", "yyy", "zzz"
}

// func foo() (result int) {
// 	result := 42 // no new variables on left side of := (exit status 1)
// 	return
// }

func foo(flag int) (result int) {
	result = 10 // 命名返回值 result

	if flag > 10 {
		result := 20                         // 遮蔽了外部的 result
		fmt.Println("Inside block:", result) // 输出 20
		return result                        // return 的是 Inside result
	}

	return result // 返回命名返回值 result（外层的result）
}
